package com.lzyyj.gmis.base.dao.hibernate;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;

import com.lzyyj.common.Page;
import com.lzyyj.gmis.base.dao.IBaseDao;

/** 
 * 针对单个Entity对象的操作定义.不依赖于具体ORM实现方案. 
 * 
 * @author lzyyj 
 * 
 */ 
public interface IHibernateBaseDao<T,PK extends Serializable> extends IBaseDao<T,PK >{ 

	/**
	 * 获取当前可用 Session (如果没有，创建新的 Session)
	 * @return
	 */
	public Session getCurrentSession();
	
	/**
	 * 查询符合条件的记录个数
	 * @param criteria
	 * @return
	 */
	public long getCount(Criteria criteria);

	/** 
	 * 根据属性名和属性值查询单个对象. 
	 *  
	 * @return 符合条件的唯一对象 or null 
	 * @see HibernateGenericDao#findUniqueBy(criteria) 
	 */ 
	public T findUniqueBy(Criteria criteria);

	/**
	 * 获得投影查询结果
	 * @param criteria
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List findProjections(Criteria criteria);

    /** 
     * 分页查询函数，使用已设好查询条件与排序的<code>Criteria</code>. 
     * 
     * @param pageNo 页号,从1开始, -1或超过总记录数，调整为最后一页. 
     * @return 含总记录数和当前页数据的Page对象. 
     */ 
	public Page<T> find(Page<T> page, Criteria criteria);
    
    /** 
     * 创建Criteria对象. 
     * 
     * @param criterions 可变的Restrictions条件列表,见{@link #getQuery(String,Object...)} 
     */ 
    public Criteria createCriteria();
    
    /**
     * 在查询中添加排序
     * @param criteria
     * @param orderBy
     * @return
     */
	public Criteria addOrder(Criteria criteria, String orderBy);

	public List<T> findBy(Criteria criteria);
	
	/** 
     * <pre> 
     * dao.getQuery(hql).setMaxResult(100).setCacheable(true).list(); 
     * </pre> 
     * 
     * <pre> 
     *        dao.createQuery(hql) 
     *        dao.createQuery(hql,arg0); 
     *        dao.createQuery(hql,arg0,arg1); 
     *        dao.createQuery(hql,new Object[arg0,arg1,arg2]) 
     * </pre> 
     * 
     * @param values 
     */ 
    public org.hibernate.Query getQuery(String jpql, Object... values);
    
    /**
     * 获得指定对象在指定查询条件下的位置序号，0算起
     * @param entity
     * @param criteria
     * @param orderBy
     * @return
     */
    public long getIndex(T entity, Criteria criteria, String orderBy);
	
}
